//
//  Problem1002.swift
//  TestProject
//
//  Created by 毕武侠 on 2021/4/13.
//  Copyright © 2021 zhulong. All rights reserved.
//

import UIKit

/*
 1002. 查找常用字符
 给定仅有小写字母组成的字符串数组 A，返回列表中的每个字符串中都显示的全部字符（包括重复字符）组成的列表。例如，如果一个字符在每个字符串中出现 3 次，但不是 4 次，则需要在最终答案中包含该字符 3 次。

 你可以按任意顺序返回答案。
 示例 1：
     输入：["bella","label","roller"]
     输出：["e","l","l"]
 示例 2：
     输入：["cool","lock","cook"]
     输出：["c","o"]
 提示：
     1 <= A.length <= 100
     1 <= A[i].length <= 100
     A[i][j] 是小写字母
 */
@objcMembers class Problem1002: NSObject {
    func solution() {
        print(commonChars(["bella","label","roller"]))
        print(commonChars(["cool","lock","cook"]))
    }
    
    /*
     以第一个字符串为标准
     1: 创建一个字典dic，存储第一个字符串所有字符出现的个数
     2: 从数组的第二个字符串开始遍历，创建一个字典ndic存储该字符串中，只存在dic中的字符个数
     3: 对比这2个dic，假如字符c不在第二个字符串中，也就是不在ndic中，那么把dic[c]删除掉
     4: 如果字符c，既存在第一个字符串dic[c] 也存在第二个字符串中ndic[c]，那么取最小的一个
     */
    func commonChars(_ A: [String]) -> [String] {
        var dic:[Character: Int] = [:]
        for c in A[0] {
            dic[c, default: 0] += 1
        }
        
        var ndic:[Character: Int] = [:]
        for i in 1..<A.count {
            for c in A[i] {
                if (dic[c] != nil) {
                    ndic[c, default: 0] += 1
                }
            }
            
            for key in dic.keys {
                if ndic[key] == nil {
                    dic.removeValue(forKey: key)
                } else {
                    dic[key] = min(dic[key]!, ndic[key]!)
                }
                
            }
            ndic.removeAll()
        }
        
        var result:[String] = []
        for key in dic.keys {
            for i in 0..<dic[key]! {
                result.append(String(key))
            }
        }
        return result
    }
}
